package common.utils.aliyun;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest;
import common.enums.FilePathEnum;
import common.utils.DateUtil;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Date;


public class OssFileUploader {

    // 请替换为你的阿里云 OSS 访问密钥 ID
    private static final String ACCESS_KEY_ID = "LTAI5tS1ukNoo1w248P1CS49";
    // 请替换为你的阿里云 OSS 访问密钥 Secret
    private static final String ACCESS_KEY_SECRET = "BLh62orKlc3zEVDz6cOAOXbt9fkGxe";
    // 请替换为你的阿里云 OSS 存储空间名称
    private static final String BUCKET_NAME = "h-ksg";
    // 请替换为你的阿里云 OSS 访问端点
    private static final String ENDPOINT = "oss-cn-hangzhou.aliyuncs.com";

    /**
     * 多部分文件上传方法
     *
     * @param file     要上传的 MultipartFile 文件
     * @param filePathEnum 文件在 OSS 中的存储路径枚举
     * @param fileName 文件名（不包含文件后缀）
     * @return 包含文件后缀的完整文件名
     */
    public static String multipartFileUpload(MultipartFile file, FilePathEnum filePathEnum, String fileName) {
        // 创建 OSSClient 实例
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);

        try {
            // 获取文件原始名称
            String originalFileName = file.getOriginalFilename();
            // 获取文件后缀
            String fileExtension = "";
            if (originalFileName != null && originalFileName.contains(".")) {
                fileExtension = originalFileName.substring(originalFileName.lastIndexOf("."));
            }

            // 拼接完整文件名
            String fullFileName = fileName + fileExtension;
            // 拼接完整的存储路径
            String fullFilePath = filePathEnum.getPath() + fullFileName;

            // 如果路径不存在，OSS 会自动处理路径创建
            // 获取文件输入流
            InputStream inputStream = file.getInputStream();

            // 创建 ObjectMetadata 对象并设置 Cache-Control
            ObjectMetadata objectMetadata = new ObjectMetadata();
            objectMetadata.setCacheControl("public");
            objectMetadata.setContentLength(inputStream.available());
            objectMetadata.setContentDisposition("inline");

            // 创建 PutObjectRequest 对象并关联 ObjectMetadata
            PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, fullFilePath, inputStream, objectMetadata);

            // 上传文件
            ossClient.putObject(putObjectRequest);

            return fullFileName;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } finally {
            // 关闭 OSSClient
            ossClient.shutdown();
        }
    }

    /**
     * 基于 HTTP URL 上传文件到 OSS
     *
     * @param url      要上传的文件的 HTTP URL
     * @param filePathEnum 文件在 OSS 中的存储路径枚举
     * @param fileName 文件名（不包含文件后缀）
     * @return 包含文件后缀的完整文件名
     */
    public static String uploadFileFromUrl(String url, FilePathEnum filePathEnum, String fileName) {
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        try {
            URL fileUrl = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) fileUrl.openConnection();
            connection.setRequestMethod("GET");
            InputStream inputStream = connection.getInputStream();

            // 获取文件后缀
            String fileExtension = "";
            String contentType = connection.getContentType();
            if (contentType != null) {
                if (contentType.contains("image/jpeg")) {
                    fileExtension = ".jpg";
                } else if (contentType.contains("image/png")) {
                    fileExtension = ".png";
                }
                // 可根据需要添加更多文件类型判断
            }

            // 拼接完整文件名
            String fullFileName = fileName + fileExtension;
            // 拼接完整的存储路径
            String fullFilePath = filePathEnum.getPath() + fullFileName;
            // 创建 ObjectMetadata 对象并设置 Cache-Control
            ObjectMetadata objectMetadata = new ObjectMetadata();
            objectMetadata.setCacheControl("public");
            objectMetadata.setContentLength(inputStream.available());
            objectMetadata.setContentDisposition("inline");

            PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, fullFilePath, inputStream, objectMetadata);
            ossClient.putObject(putObjectRequest);

            return fullFileName;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } finally {
            ossClient.shutdown();
        }
    }

    /**
     * 基于 HTTP URL 上传文件到 OSS
     * 该方法文件名使用generatorFileName进行随机
     * @param url      要上传的文件的 HTTP URL
     * @param filePathEnum 文件在 OSS 中的存储路径枚举
     * @return 包含文件后缀的完整文件名
     */
    public static String uploadFileFromUrl(String url, FilePathEnum filePathEnum) {
        return uploadFileFromUrl(url, filePathEnum, generatorFileName());
    }

    /**
     * 生成文件名
     *
     * @return 文件名
     */
    public static String generatorFileName() {
        return DateUtil.format(new Date(), DateUtil.YYYYMMDDHHMMSS) + (int) ((Math.random()*9+1)*100000);
    }
//
//    public static String uploadVideoFirstFrameToOSS(MultipartFile videoFile) throws IOException {
//        // 提取视频第一帧
//        BufferedImage firstFrame = VideoUtil.extractFirstFrame(videoFile);
//
//        // 将第一帧图片转换为字节数组
//        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//        ImageIO.write(firstFrame, "jpg", outputStream);
//        byte[] imageBytes = outputStream.toByteArray();
//
//        // 上传到阿里云 OSS
//        String objectName = "video_first_frames/" + System.currentTimeMillis() + ".jpg";
//        // uploadToOSS(new ByteArrayInputStream(imageBytes), objectName);
//
//        return "https://" + BUCKET_NAME + "." + ENDPOINT + "/" + objectName;
//    }

    public static void main(String[] args) {
        String url = uploadFileFromUrl("https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTJ1Ru8vNhQgT6ia2VS4B7o3tP7kL6duu6HYILQaFOhFlPyUpL3aARxKftenJbrpEgAzgjdqCoNDxmw/132", FilePathEnum.SYSTEM_DEFAULT, generatorFileName());
        System.out.println(url);
    }
}